{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cd108c7c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-31T13:27:17.834718Z",
     "start_time": "2023-07-31T13:27:17.826992Z"
    }
   },
   "source": [
    "##  basics"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3af65b4a",
   "metadata": {},
   "source": [
    "```\n",
    "train_loader = torch.utils.data.DataLoader(\n",
    "    torchvision.datasets.MNIST('data', train=True, download=True, \n",
    "                               transform=torchvision.transforms.Compose([\n",
    "                                   torchvision.transforms.ToTensor()\n",
    "                               ])),\n",
    "    shuffle=True, batch_size=64, drop_last=True)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4886c75e",
   "metadata": {},
   "source": [
    "### datasets"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d4a7135",
   "metadata": {},
   "source": [
    "- `torchvision.datasets.MNIST`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d61a5a2d",
   "metadata": {},
   "source": [
    "## transforms"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "408c9411",
   "metadata": {},
   "source": [
    "```\n",
    "from einops import rearrange\n",
    "from torchvision import transforms\n",
    "from PIL import Image\n",
    "\n",
    "transform = transforms.Compose(\n",
    "    [\n",
    "        transforms.Resize((224, 224)),\n",
    "        transforms.RandomResizedCrop(224),\n",
    "        transforms.RandomHorizontalFlip(),\n",
    "        transforms.ToTensor(),\n",
    "    ]\n",
    ")\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74222ca2",
   "metadata": {},
   "source": [
    "### ToTensor"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45c48d90",
   "metadata": {},
   "source": [
    "- `torchvision.transforms.ToTensor()`\n",
    "    - 归一化（0-255 => 0-1）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04cb4ae7",
   "metadata": {},
   "source": [
    "### "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "668637df",
   "metadata": {},
   "source": [
    "## utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7493a429",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-03-11T15:08:36.987136Z",
     "start_time": "2024-03-11T15:08:36.983412Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "from torchvision.utils import make_grid\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.utils.data import DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f656eb42",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-03-11T15:08:53.005232Z",
     "start_time": "2024-03-11T15:08:52.932892Z"
    }
   },
   "outputs": [],
   "source": [
    "dataset = torchvision.datasets.MNIST(root=\"./data/\", train=True, \n",
    "                                     download=True, \n",
    "                                     transform=torchvision.transforms.ToTensor())\n",
    "train_dataloader = DataLoader(dataset, batch_size=8, shuffle=True)\n",
    "x, y = next(iter(train_dataloader))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "771c697d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-03-11T15:09:05.996018Z",
     "start_time": "2024-03-11T15:09:05.989209Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([8, 1, 28, 28])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "d7194d8a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-03-11T15:10:22.932977Z",
     "start_time": "2024-03-11T15:10:22.925249Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([3, 32, 242])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "make_grid(x).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c526394d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-03-11T15:10:45.105530Z",
     "start_time": "2024-03-11T15:10:44.994081Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7928c5d98850>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(make_grid(x)[0], cmap='Greys')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
